package com.sinosoft.vaccinetoai.utils;

import cn.hutool.core.lang.Singleton;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.StrUtil;

/**
 * ID相关工具类
 * @author xzh
 * @date 2022-10-24 14:38
 * @since 5.0.0
 */
public class IdUtils {

    // Worker Id
    private static Long workerId = 1L;

    public static void init(Long workerId) {
        if(null != workerId) {
            IdUtils.workerId = workerId;
        }
    }

    /**
     * 生成ID
     * @return long ID
     * @author xzh
     * @since 1.0.0
     */
    public static long generateId() {
        return generateId(null);
    }

    /**
     * 生成ID
     * @param key 独立的对象key
     * @return long ID
     * @author xzh
     * @since 1.0.0
     */
    public static long generateId(String key) {
        Snowflake snowflake = Singleton.get(genKey(key), () -> new Snowflake(workerId));
        return snowflake.nextId();
    }

    /**
     * 生成ID（字符串）
     * @return {@link String } ID
     * @author xzh
     * @since 1.0.0
     */
    public static String generateIdStr() {
        return Long.toString(generateId());
    }

    /**
     * 生成ID（字符串）
     * @param key 独立的对象key
     * @return {@link String } ID
     * @author xzh
     * @since 1.0.0
     */
    public static String generateIdStr(String key) {
        return Long.toString(generateId(key));
    }

    /**
     * 生成独立的对象key
     * @param suffix 后缀
     * @return {@link String }
     * @author xzh
     * @since 1.0.0
     */
    private static String genKey(String suffix) {
        if(StrUtil.isEmpty(suffix)) {
            suffix = "COMMON";
        }
        return StrUtil.join("#", Snowflake.class.getName(), suffix);
    }

}
